package sys_ctrl

import (
	"ubt-gin-admin/app/api/model/sys_mod"
	"ubt-gin-admin/app/api/service/sys_serv"
	"ubt-gin-admin/app/pkg/enums"
	"ubt-gin-admin/app/pkg/parse"
	"ubt-gin-admin/app/utils"

	"github.com/gin-gonic/gin"
)

type feedback struct{}

var FeedbackCtrl feedback

// Save 保存
func (c *feedback) Save(ctx *gin.Context) {
	// 通过头部请求的token获取用户信息
	token := ctx.GetHeader("token")
	userInfo := utils.GetUserInfo(ctx, token)
	if userInfo == nil {
		utils.ToJson(ctx, enums.NoLoginErr.Code, enums.NoLoginErr.Msg, nil)
		return
	}
	req := &sys_mod.FeedbackSaveReq{}
	// 将请求的参数转换为请求结构体
	if err := parse.Parse(ctx, req); err != "" {
		utils.ToJson(ctx, enums.ParamErr.Code, err, nil)
		return
	}
	// 过滤关键参数值中的非法字符
	req.FbId = utils.InputFilter(req.FbId, true)
	req.FbUser = utils.InputFilter(req.FbUser, true)
	req.Phone = utils.InputFilter(req.Phone, true)
	req.Email = utils.InputFilter(req.Email, true)
	req.FbType = utils.InputFilter(req.FbType, true)
	req.ParentId = utils.InputFilter(req.ParentId, true)
	req.ImgUrls = utils.InputFilter(req.ImgUrls, true)
	req.ImgIds = utils.InputFilter(req.ImgIds, true)
	req.ImgNames = utils.InputFilter(req.ImgNames, true)
	if req.FbId == req.ParentId {
		utils.ToJson(ctx, enums.ParentErr.Code, enums.ParentErr.Msg, nil)
		return
	}
	var (
		code string
		msg  string
	)
	req.FbUser = userInfo.UserId
	if req.FbId == "" {
		// 新增
		code, msg = sys_serv.FeedbackServ.Add(req)
	} else {
		// 修改
		code, msg = sys_serv.FeedbackServ.Update(req)
	}
	utils.ToJson(ctx, code, msg, nil)
}

// Process 删除、启用、停用
func (c *feedback) Process(ctx *gin.Context) {
	// 通过头部请求的token获取用户信息
	token := ctx.GetHeader("token")
	userInfo := utils.GetUserInfo(ctx, token)
	if userInfo == nil {
		utils.ToJson(ctx, enums.NoLoginErr.Code, enums.NoLoginErr.Msg, nil)
		return
	}
	req := &sys_mod.FeedbackProReq{}
	// 将请求的参数转换为请求结构体
	if err := parse.Parse(ctx, req); err != "" {
		utils.ToJson(ctx, enums.ParamErr.Code, err, nil)
		return
	}
	// 过滤关键参数值中的非法字符
	req.FbIds = utils.InputFilter(req.FbIds, true)
	code, msg := sys_serv.FeedbackServ.Process(req)
	utils.ToJson(ctx, code, msg, nil)
}

// One 详情
func (c *feedback) One(ctx *gin.Context) {
	// 通过头部请求的token获取用户信息
	token := ctx.GetHeader("token")
	userInfo := utils.GetUserInfo(ctx, token)
	if userInfo == nil {
		utils.ToJson(ctx, enums.NoLoginErr.Code, enums.NoLoginErr.Msg, nil)
		return
	}
	// 过滤关键参数值中的非法字符
	fbId := ctx.Query("fbId")
	fbId = utils.InputFilter(fbId, true)
	if fbId == "" || len(fbId) != 21 {
		utils.ToJson(ctx, enums.ParamErr.Code, enums.ParamErr.Msg, nil)
		return
	}
	code, msg, data := sys_serv.FeedbackServ.One(fbId)
	utils.ToJson(ctx, code, msg, data)
}

// Page 分页列表
func (c *feedback) Page(ctx *gin.Context) {
	// 通过头部请求的token获取用户信息
	token := ctx.GetHeader("token")
	userInfo := utils.GetUserInfo(ctx, token)
	if userInfo == nil {
		utils.ToJson(ctx, enums.NoLoginErr.Code, enums.NoLoginErr.Msg, nil)
		return
	}
	keywords := ctx.Query("keywords")
	fbType := ctx.Query("fbType")
	limits := ctx.Query("limit")
	offsets := ctx.Query("offset")
	keywords = utils.InputFilter(keywords, false)
	fbType = utils.InputFilter(fbType, true)
	limits = utils.InputFilter(limits, true)
	offsets = utils.InputFilter(offsets, true)
	limit := parse.Str2u8(limits)
	offset := parse.Str2u32(offsets)
	// 先统计信息的数量
	req := &sys_mod.FeedbackPageReq{Keywords: keywords, FbType: fbType}
	code, msg, data := sys_serv.FeedbackServ.Count(req)
	if code == enums.Succeed.Code {
		res := &sys_mod.FeedbackPageRes{Total: data}
		// 再查询具体的信息列表
		req.Limit = limit
		req.Offset = offset
		if code, msg, data = sys_serv.FeedbackServ.Page(req); code == enums.Succeed.Code {
			res.List = data
			utils.ToJson(ctx, code, msg, res)
			return
		}
	}
	utils.ToJson(ctx, code, msg, nil)
}

// Replied 树状列表
func (c *feedback) Replied(ctx *gin.Context) {
	// 通过头部请求的token获取用户信息
	token := ctx.GetHeader("token")
	userInfo := utils.GetUserInfo(ctx, token)
	if userInfo == nil {
		utils.ToJson(ctx, enums.NoLoginErr.Code, enums.NoLoginErr.Msg, nil)
		return
	}
	parentId := ctx.Query("parentId")
	parentId = utils.InputFilter(parentId, true)
	if parentId == "" || len(parentId) != 21 {
		utils.ToJson(ctx, enums.ParamErr.Code, enums.ParamErr.Msg, nil)
		return
	}
	code, msg, data := sys_serv.FeedbackServ.Replied(parentId)
	utils.ToJson(ctx, code, msg, data)
}
